import os
import sys
import argparse
from pathlib import Path
import PyPDF2
import traceback

def convert_pdf_to_txt(pdf_path):
    """
    将单个PDF文件转换为TXT文件，保存在同一文件夹
    
    参数:
    pdf_path (str): PDF文件的路径
    
    返回:
    str: 创建的TXT文件的路径
    """
    # 创建与原文件同名但扩展名为.txt的输出文件路径（在同一文件夹）
    output_path = os.path.splitext(pdf_path)[0] + '.txt'
    
    try:
        # 首先检查文件是否存在
        if not os.path.exists(pdf_path):
            print(f"错误: 文件不存在 - {pdf_path}")
            return None
            
        # 检查文件大小是否为0
        if os.path.getsize(pdf_path) == 0:
            print(f"错误: 文件大小为0 - {pdf_path}")
            return None
        
        # 打开PDF文件并打印详细信息
        print(f"处理文件: {pdf_path}")
        
        with open(pdf_path, 'rb') as pdf_file:
            try:
                # 创建PDF阅读器对象
                pdf_reader = PyPDF2.PdfReader(pdf_file)
                
                # 打印页数信息
                num_pages = len(pdf_reader.pages)
                print(f"  PDF页数: {num_pages}")
                
                if num_pages == 0:
                    print(f"  警告: PDF没有页面")
                    return None
                
                # 提取文本内容
                text = ""
                for page_num in range(num_pages):
                    print(f"  提取页面 {page_num+1}/{num_pages}")
                    page = pdf_reader.pages[page_num]
                    page_text = page.extract_text()
                    if page_text:
                        text += page_text + "\n\n"
                    else:
                        print(f"  警告: 页面 {page_num+1} 未提取到文本")
                
                if not text.strip():
                    print(f"  警告: 未能从PDF中提取到任何文本")
                    return None
                
                # 写入TXT文件
                with open(output_path, 'w', encoding='utf-8') as txt_file:
                    txt_file.write(text)
                
                print(f"成功: {pdf_path} -> {output_path}")
                return output_path
                
            except PyPDF2.errors.PdfReadError as e:
                print(f"  错误: PDF读取错误 - {str(e)}")
                return None
                
    except Exception as e:
        print(f"错误转换 {pdf_path}: {str(e)}")
        print(f"详细错误: {traceback.format_exc()}")
        return None

def batch_convert_pdfs(input_dir):
    """
    批量转换目录中的所有PDF文件为TXT文件，保存在同一目录
    
    参数:
    input_dir (str): 包含PDF文件的目录
    
    返回:
    tuple: (成功转换的文件数, 转换失败的文件数, 找到的PDF文件总数)
    """
    # 确保使用绝对路径
    input_path = Path(os.path.abspath(input_dir))
    
    # 打印实际使用的路径
    print(f"使用路径: {input_path}")
    
    # 检查目录是否存在
    if not input_path.exists():
        print(f"错误: 目录不存在 - {input_path}")
        return 0, 0, 0
        
    if not input_path.is_dir():
        print(f"错误: 不是一个目录 - {input_path}")
        return 0, 0, 0
    
    success_count = 0
    failure_count = 0
    
    # 查找所有PDF文件（不区分大小写）
    pdf_files = []
    for file in input_path.iterdir():
        if file.is_file() and file.suffix.lower() == '.pdf':
            pdf_files.append(file)
    
    total_files = len(pdf_files)
    
    if total_files == 0:
        print(f"警告: 在目录 {input_path} 中没有找到PDF文件")
        # 列出目录中的所有文件以帮助诊断
        print(f"目录中的文件:")
        for file in input_path.iterdir():
            if file.is_file():
                print(f"  - {file.name} ({file.suffix})")
        return 0, 0, 0
    
    print(f"找到 {total_files} 个PDF文件:")
    for pdf_file in pdf_files:
        print(f"  - {pdf_file.name}")
    
    # 遍历输入目录中的所有PDF文件
    for i, pdf_file in enumerate(pdf_files):
        print(f"\n处理文件 {i+1}/{total_files}: {pdf_file.name}")
        
        # 转换PDF到TXT
        result = convert_pdf_to_txt(str(pdf_file))
        
        if result:
            success_count += 1
        else:
            failure_count += 1
    
    return success_count, failure_count, total_files

def main():
    # 创建命令行参数解析器
    parser = argparse.ArgumentParser(description='批量将PDF文件转换为TXT文件（保存在同一目录）')
    parser.add_argument('input_dir', help='包含PDF文件的目录')
    
    # 解析命令行参数
    args = parser.parse_args()
    
    # 打印系统信息
    print(f"当前工作目录: {os.getcwd()}")
    print(f"PyPDF2 版本: {PyPDF2.__version__}")
    print(f"Python 版本: {sys.version}\n")
    
    # 执行批量转换
    success, failure, total = batch_convert_pdfs(args.input_dir)
    
    # 打印转换结果摘要
    print(f"\n转换完成：")
    print(f"找到的PDF文件: {total}")
    print(f"成功转换: {success} 文件")
    print(f"失败转换: {failure} 文件")
    
    if total == 0:
        print("\n可能的问题: ")
        print("1. 目录路径不正确")
        print("2. 目录中没有PDF文件")
        print("3. PDF文件没有.pdf扩展名")
        print(f"4. 程序可能没有访问目录 {args.input_dir} 的权限")
        print("\n调试建议:")
        print(f"1. 使用命令检查目录: ls -la {args.input_dir}")
        print(f"2. 检查目录中是否有PDF文件: find {args.input_dir} -name \"*.pdf\"")
        print("3. 尝试直接访问一个PDF文件进行测试: ")
        print(f"   python -c \"import PyPDF2; reader = PyPDF2.PdfReader('{args.input_dir}/某个文件.pdf'); print(len(reader.pages))\"")

if __name__ == "__main__":
    main()